package clases.contabilidad;

import CapaDatos.DataSource;
import CapaDatos.Sql;
import global.Dialogos;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Asiento extends Ejercicio {

    private int idasiento;
    private int numero;
    private String tipo;
    private String fecha;
    private String documento;
    private String descripcion;
    private String sql;
    public DataSource dt;

    public int getIdasiento() {
        return idasiento;
    }

    public void setIdasiento(int idasiento) {
        this.idasiento = idasiento;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    public String getDocumento() {
        return documento;
    }

    public void setDocumento(String documento) {
        this.documento = documento;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Asiento() {
        dt = new DataSource();

    }

    /**
     * Metodo que genera el numero del asiento del ejercicio contable actual
     *
     * @return un valor de int
     */
    public int numero() {
        try {
            sql = "SELECT MAX(NUMERO) FROM ASIENTO JOIN EJERCICIO ON EJERCICIO.IDEJERCICIO=ASIENTO.IDEJERCICIO WHERE EJERCICIO.ESTADO=TRUE";
            Sql.getConsulta(sql, dt);
            while (dt.next()) {
                return dt.getInt(1) + 1;

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * Metodo que guarda el aisento contable
     * @return 
     */
    public boolean guardarAsiento() {
        idasiento = Sql.getMax("idasiento", "asiento", true);
        sql = "INSERT INTO ASIENTO VALUES (" + this.idasiento + ", " + "" + this.getidEjercicio()
                + ", " + this.numero() + ", '" + this.fecha + "', '" + this.tipo + "', '" + this.documento + "', "
                + "'" + this.descripcion + "')";
        return Sql.insertar(sql) == true;

    }

    public boolean actualizarAsiento() {
        sql = "UPDATE ASIENTO SET FECHA='" + this.fecha + "', TIPO='" + this.tipo + "', "
                + "DOCUMENTO='" + this.documento + "', DESCRIPCION='" + this.descripcion + "' "
                + "WHERE IDASIENTO='" + this.idasiento + "' AND IDEJERCICIO=" + this.getidEjercicio() + "";
        return Sql.actualizar(sql)==true;

    }

    /**
     * Metodo que obtiene el idejercicio de un Ejercicio
     *
     * @return el valor de tipo int
     */
    protected int getidEjercicio() {
        try {
            sql = "SELECT IDEJERCICIO FROM EJERCICIO WHERE ESTADO=TRUE";
            Sql.getConsulta(sql, dt);
            while (dt.next()) {
                return dt.getInt(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public String SqlGeneral() {
        sql = "SELECT ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION,\n"
                + "SUM(DETALLEASIENTO.DEBE) AS DEBE, \n"
                + "SUM(DETALLEASIENTO.HABER) AS HABER\n"
                + "FROM ASIENTO JOIN DETALLEASIENTO\n"
                + "ON ASIENTO.IDASIENTO=DETALLEASIENTO.IDASIENTO\n"
                + "JOIN EJERCICIO ON EJERCICIO.IDEJERCICIO=ASIENTO.IDEJERCICIO\n"
                + "WHERE EJERCICIO.ESTADO=TRUE\n"
                + "GROUP BY ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION\n"
                + "ORDER BY ASIENTO.NUMERO DESC";

        return sql;
    }

    public String SqlNumero(int numero) {
        sql = "SELECT ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION,\n"
                + "SUM(DETALLEASIENTO.DEBE) AS DEBE, \n"
                + "SUM(DETALLEASIENTO.HABER) AS HABER\n"
                + "FROM ASIENTO JOIN DETALLEASIENTO\n"
                + "ON ASIENTO.IDASIENTO=DETALLEASIENTO.IDASIENTO\n"
                + "JOIN EJERCICIO ON EJERCICIO.IDEJERCICIO=ASIENTO.IDEJERCICIO\n"
                + "WHERE EJERCICIO.ESTADO=TRUE AND ASIENTO.NUMERO=" + numero + "\n"
                + "GROUP BY ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION\n"
                + "ORDER BY ASIENTO.NUMERO DESC";
        return sql;
    }

    public String SqlFecha(String fecha) {
        sql = "SELECT ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION,\n"
                + "SUM(DETALLEASIENTO.DEBE) AS DEBE, \n"
                + "SUM(DETALLEASIENTO.HABER) AS HABER\n"
                + "FROM ASIENTO JOIN DETALLEASIENTO\n"
                + "ON ASIENTO.IDASIENTO=DETALLEASIENTO.IDASIENTO\n"
                + "JOIN EJERCICIO ON EJERCICIO.IDEJERCICIO=ASIENTO.IDEJERCICIO\n"
                + "WHERE EJERCICIO.ESTADO=TRUE AND ASIENTO.FECHA='" + fecha + "'\n"
                + "GROUP BY ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION\n"
                + "ORDER BY ASIENTO.NUMERO DESC";
        return sql;
    }

    public String SqlDocumento(String documento) {
        sql = "SELECT ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION,\n"
                + "SUM(DETALLEASIENTO.DEBE) AS DEBE, \n"
                + "SUM(DETALLEASIENTO.HABER) AS HABER\n"
                + "FROM ASIENTO JOIN DETALLEASIENTO\n"
                + "ON ASIENTO.IDASIENTO=DETALLEASIENTO.IDASIENTO\n"
                + "JOIN EJERCICIO ON EJERCICIO.IDEJERCICIO=ASIENTO.IDEJERCICIO\n"
                + "WHERE EJERCICIO.ESTADO=TRUE AND ASIENTO.DOCUMENTO LIKE '" + documento + "%'\n"
                + "GROUP BY ASIENTO.NUMERO, ASIENTO.FECHA, ASIENTO.DOCUMENTO, ASIENTO.DESCRIPCION\n"
                + "ORDER BY ASIENTO.NUMERO DESC";
        return sql;
    }

    public void ConsutaAsiento(DefaultTableModel modelo, JTable tabla, String sql, JLabel Lpaginatotal, JLabel Lpagina, int pagina) {
        modelo = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false;
            }
        };
        tabla.setModel(modelo);
        modelo.addColumn("NUMERO");
        modelo.addColumn("FECHA");
        modelo.addColumn("DOCUMENTO");
        modelo.addColumn("DESCRIPCION");
        modelo.addColumn("DEBE");
        modelo.addColumn("HABER");
        DefaultTableCellRenderer centrar = new DefaultTableCellRenderer();
        centrar.setHorizontalAlignment(SwingConstants.RIGHT);
        tabla.getColumnModel().getColumn(4).setCellRenderer(centrar);
        tabla.getColumnModel().getColumn(5).setCellRenderer(centrar);
        TableColumn columna = new TableColumn();
        columna = tabla.getColumnModel().getColumn(3);
        columna.setPreferredWidth(300);
        sql = objPaginacion.getPaginacion(sql, pagina, 25);
        Sql.getConsulta(sql, dt);

        String[] fila;

        while (dt.next()) {
            fila = new String[6];
            fila[0] = dt.getString(1);
            fila[1] = dt.getString(2);
            fila[2] = dt.getString(3);
            fila[3] = dt.getString(4);
            fila[4] = dt.getString(5);
            fila[5] = dt.getString(6);

            modelo.addRow(fila);

        }

        objPaginacion.actualPagina(Lpagina);
        objPaginacion.totalPaginas(Lpaginatotal);
        tabla.getSelectionModel().setSelectionInterval(0, 0);
    }

    public void llenardatosAsiento(int numero) {
        sql = "SELECT * FROM ASIENTO WHERE NUMERO='" + numero + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.idasiento = dt.getInt(1);
            this.setIdejercicio(dt.getInt(2));
            this.numero = dt.getInt(3);
            this.fecha = dt.getString(4);
            this.tipo = dt.getString(5);
            this.documento = dt.getString(6);
            this.descripcion = dt.getString(7);

        }
    }
}
